๐ 1. Introduzione
Finora abbiamo visto come rappresentare numeri interi positivi in binario. Ma come facciamo a rappresentare numeri negativi e numeri con la virgola? Questo รจ fondamentale per permettere ai computer di eseguire calcoli realistici.
- Numeri negativi: Come distinguere -5 da +5 in binario?
- Numeri decimali: Come rappresentare 3.14, 0.5, -2.75?
- Range e precisione: Come bilanciare numeri molto grandi e molto piccoli?
๐ Metodi di rappresentazione
| Metodo | Cosa rappresenta | Complessitร | Uso |
|---|---|---|---|
| Segno e Modulo | Numeri interi con segno | โญ Facile | Didattico (poco usato) |
| Complemento a 2 | Numeri interi con segno | โญโญ Media | Standard per interi |
| Virgola Fissa | Numeri decimali con precisione fissa | โญโญ Media | DSP, finanza |
| Virgola Mobile (IEEE 754) | Numeri decimali con range ampio | โญโญโญ Avanzata | Standard universale |
โ 2. Rappresentazione dei Numeri Negativi
๐ Metodo 1: Segno e Modulo (Sign-Magnitude)
Il metodo piรน intuitivo: usiamo 1 bit per il segno (0=positivo, 1=negativo) e i restanti bit per il valore assoluto.
Esempio con 8 bit:
S = bit di segno (0=+, 1=-) | 7-1 = valore assoluto
- Esistono due zeri (+0 e -0)
- Hardware complesso per addizioni/sottrazioni
- Range asimmetrico: con 8 bit vai da -127 a +127
๐ Metodo 2: Complemento a 1 (One's Complement)
Per ottenere il negativo di un numero, si invertono tutti i bit.
Persiste il problema dei due zeri e richiede correzioni nell'hardware.
๐ Metodo 3: Complemento a 2 (Two's Complement) โ
Questo รจ il metodo standard usato in tutti i computer moderni! Per ottenere il negativo: inverti tutti i bit e aggiungi 1.
- Un solo zero (00000000)
- Addizione e sottrazione usano lo stesso circuito
- Range: da -2โฟโปยน a +2โฟโปยน-1
- Estensione del segno semplice
Calcolare -42 in complemento a 2 (8 bit)
๐ Range con complemento a 2
| Bit | Range | Piรน piccolo (binario) | Piรน grande (binario) |
|---|---|---|---|
| 4 bit | -8 a +7 | 1000 = -8 | 0111 = +7 |
| 8 bit | -128 a +127 | 10000000 = -128 | 01111111 = +127 |
| 16 bit | -32768 a +32767 | 1000000000000000 | 0111111111111111 |
| 32 bit | -2ยณยน a +2ยณยน-1 | โ -2.1 miliardi | โ +2.1 miliardi |
In complemento a 2, guarda il bit piรน significativo (MSB):
- MSB = 0 โ Numero positivo o zero
- MSB = 1 โ Numero negativo
๐ 3. Virgola Fissa (Fixed-Point)
Nella rappresentazione a virgola fissa, si stabilisce una volta per tutte quanti bit dedicare alla parte intera e quanti alla parte frazionaria.
๐ Formato Qm.n
La notazione Qm.n indica:
- m = bit per la parte intera (incluso segno)
- n = bit per la parte frazionaria
Esempio: Q4.4 (8 bit totali)
Parte intera (4 bit) | Virgola fissa | Parte frazionaria (4 bit)
Esempio: Rappresentare 5.75 in Q4.4
๐ฏ Conversione parte frazionaria
Come convertire 0.625 in binario
- Range limitato: Q4.4 va da -8.0 a +7.9375
- Precisione fissa: Con 4 bit frazionari, step minimo = 2โปโด = 0.0625
- Sprechi: Se rappresenti 0.001, sprechi i bit della parte intera
๐ Esempi di formati a virgola fissa
| Formato | Bit totali | Parte intera | Parte frazionaria | Range | Precisione |
|---|---|---|---|---|---|
| Q4.4 | 8 | 4 | 4 | -8 a +7.9375 | 0.0625 |
| Q8.8 | 16 | 8 | 8 | -128 a +127.996 | 0.00390625 |
| Q16.16 | 32 | 16 | 16 | -32768 a +32767.999 | 0.0000152587 |
๐ 4. Virgola Mobile (Floating-Point)
La rappresentazione a virgola mobile (floating-point) risolve i limiti della virgola fissa permettendo di rappresentare numeri con range enorme e precisione variabile.
๐ก Notazione Scientifica
La virgola mobile si basa sulla notazione scientifica:
Esempi in decimale:
- 123.45 = 1.2345 ร 10ยฒ
- 0.00056 = 5.6 ร 10โปโด
- -6789000 = -6.789 ร 10โถ
๐ Vantaggi della virgola mobile
- Range enorme: Da โ10โปยณโธ a โ10ยณโธ con 32 bit
- Precisione relativa: Piรน cifre significative per numeri piccoli e grandi
- Standard universale: IEEE 754 usato in tutti i processori
- Hardware efficiente: FPU (Floating-Point Unit) dedicate
๐ข 5. IEEE 754 Single Precision (32 bit)
Lo standard IEEE 754 single precision (chiamato anche float in molti linguaggi) usa 32 bit divisi in tre parti.
Struttura di un float (32 bit):
โ Segno (1 bit) | โ Esponente (8 bit) | โ Mantissa (23 bit)
๐ Componenti del formato
- 0 = numero positivo
- 1 = numero negativo
L'esponente รจ rappresentato con bias +127:
- Esponente memorizzato = Esponente reale + 127
- Range: da -126 a +127
- 00000000 e 11111111 sono riservati per casi speciali
La mantissa rappresenta la parte frazionaria con un 1 implicito:
- Formato: 1.xxxxxxxxxxxxxxxxx (1 + 23 bit frazionari)
- Il "1." รจ implicito e non viene memorizzato (bit nascosto)
- Si guadagna 1 bit di precisione!
๐ฏ Formula completa
Esempio completo: Rappresentare -12.375 in IEEE 754 single precision
๐ Valori speciali
| Valore | Esponente | Mantissa | Significato |
|---|---|---|---|
| Zero | 00000000 | tutti 0 | ยฑ0 (dipende dal segno) |
| Denormalizzati | 00000000 | non tutti 0 | Numeri molto piccoli |
| Infinito | 11111111 | tutti 0 | ยฑโ (overflow) |
| NaN | 11111111 | non tutti 0 | Not a Number (0/0, โ-1) |
๐ Precisione e Range
- Precisione: โ 7 cifre decimali significative
- Range positivo: da โ1.4 ร 10โปโดโต a โ3.4 ร 10ยณโธ
- Epsilon macchina: โ1.19 ร 10โปโท (piรน piccola differenza rappresentabile)
๐ข๐ข 6. IEEE 754 Double Precision (64 bit)
Il formato double precision (chiamato double) usa 64 bit per una precisione e range maggiori.
Struttura di un double (64 bit):
โ Segno (1 bit) | โ Esponente (11 bit) | โ Mantissa (52 bit)
| Componente | Float (32 bit) | Double (64 bit) |
|---|---|---|
| Bit esponente | 8 bit | 11 bit |
| Bias esponente | 127 | 1023 |
| Bit mantissa | 23 bit | 52 bit |
| Precisione decimale | โ 7 cifre | โ 15-16 cifre |
| Range | โยฑ10ยณโธ | โยฑ10ยณโฐโธ |
๐ฏ Formula Double Precision
๐ญ 7. Casi Speciali e Valori Particolari
๐ด Zero
โพ๏ธ Infinito
- Divisione per zero:
1.0 / 0.0 = +โ - Overflow: numero troppo grande
- Operazioni:
โ + 5 = โ,โ ร 2 = โ
๐ซ NaN (Not a Number)
0.0 / 0.0โ - โโ / โโ(-1)log(-5)
๐ฌ Numeri Denormalizzati (Subnormal)
I numeri denormalizzati permettono di rappresentare valori molto vicini allo zero, riempiendo il "gap" tra 0 e il piรน piccolo numero normalizzato.
- Esponente = 00000000
- Mantissa โ 00000000...
- Il "1." implicito diventa "0."
- Formula:
(-1)หข ร 0.mantissa ร 2โปยนยฒโถ
๐ 8. Conversioni Pratiche
๐ฅ Da decimale a IEEE 754
Algoritmo completo
- Gestisci il segno: Se negativo, s=1 e lavora col valore assoluto
- Converti in binario: Sia parte intera che frazionaria
- Normalizza: Sposta la virgola dopo il primo 1 e conta l'esponente
- Calcola esponente con bias: E_memorizzato = E_reale + 127 (float)
- Estrai mantissa: I bit dopo il punto, senza il "1." iniziale
- Combina: [S][Esponente][Mantissa]
๐ค Da IEEE 754 a decimale
Algoritmo completo
- Estrai i bit: Separa segno, esponente e mantissa
- Verifica casi speciali: Zero, infinito, NaN
- Calcola esponente reale: E_reale = E_memorizzato - 127
- Ricostruisci mantissa: 1.mantissa in decimale
- Applica la formula: (-1)หข ร mantissa ร 2^E_reale
Esempio: Decodificare 0 10000010 10001100000000000000000
๐งฎ 9. Calcolatori Interattivi
๐ข Convertitore Complemento a 2
Complemento a 2
๐ Convertitore Virgola Fissa
Fixed-Point Converter
๐ Convertitore IEEE 754
IEEE 754 Floating-Point
๐ Decodificatore IEEE 754
Decodifica binario IEEE 754
๐ 10. Esercizi Interattivi
๐ฒ Generatore di Esercizi
Esercizi Complemento a 2
Esercizi Virgola Fissa
Esercizi IEEE 754
โ ๏ธ 11. Errori Comuni e Insidie
Motivo: Gli errori di arrotondamento rendono i confronti diretti inaffidabili.
Problema: Usare l'esponente binario direttamente senza sottrarre il bias
Soluzione: Float: E_reale = E_binario - 127, Double: E_reale = E_binario - 1023
Problema: Trattare la mantissa come 0.xxx invece di 1.xxx
Soluzione: La mantissa normalizzata รจ sempre 1.xxx (il "1." รจ implicito!)
Soluzione: Verifica sempre i risultati di calcoli con numeri estremi.
Soluzione: Riorganizza i calcoli per evitare sottrazioni tra numeri simili.
๐ฏ 12. Trucchi e Ottimizzazioni
โ 13. Checklist di Autovalutazione
- โ Conosco le differenze tra segno-modulo, complemento a 1 e complemento a 2
- โ So calcolare il complemento a 2 di un numero
- โ Capisco perchรฉ il complemento a 2 รจ lo standard
- โ So qual รจ il range di valori per N bit in complemento a 2
- โ Riconosco un numero negativo guardando il MSB
- โ Capisco il formato Qm.n
- โ So convertire numeri decimali in virgola fissa
- โ So convertire la parte frazionaria con moltiplicazioni successive
- โ Conosco i limiti di range e precisione
- โ Conosco la struttura: 1 bit segno + 8 bit esponente + 23 bit mantissa
- โ Capisco il concetto di bias (127 per float)
- โ So cos'รจ il bit implicito nella mantissa
- โ So normalizzare un numero binario (1.xxx ร 2โฟ)
- โ So convertire da decimale a IEEE 754
- โ So decodificare un numero IEEE 754 in decimale
- โ Riconosco i valori speciali (ยฑ0, ยฑโ, NaN)
- โ Conosco le differenze tra float e double
- โ So che il bias รจ 1023 per double
- โ Capisco il trade-off tra precisione e range
- โ Capisco gli errori di arrotondamento
- โ So perchรฉ non si devono confrontare float con ==
- โ Conosco il concetto di epsilon macchina
- โ Comprendo overflow e underflow
- โ So cosa sono i numeri denormalizzati
๐ Conclusione
Complimenti! Hai completato questa guida completa sulla rappresentazione di numeri negativi e reali in binario!
Ora comprendi come i computer rappresentano realmente tutti i tipi di numeri, dai negativi ai decimali. Questa conoscenza รจ fondamentale per capire i limiti e le caratteristiche dei calcoli al computer. ๐ป
Continua a esercitarti con i calcolatori interattivi e gli esercizi randomici! ๐ฏ
"In informatica, 2.0 + 2.0 = 4.0, ma 0.1 + 0.2 potrebbe non essere esattamente 0.3!" ๐